﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PersonalAccounting.DataAccess;

namespace PersonalAccounting.Business
{
    public class MovimientoFacade : IFacade<Movimiento>
    {

        #region IFacade<Cuenta> Members

        public bool Select(Movimiento obj)
        {
            IDAO<MovimientoVO> dao = new DAOMovimiento();
            MovimientoVO movimiento = BuildMovimientoVO(obj);
            return dao.Select(movimiento);
        }

        public void Load(Movimiento obj)
        {
            throw new NotImplementedException();
        }


        public bool Insert(Movimiento obj)
        {
            IDAO<MovimientoVO> dao = new DAOMovimiento();
            MovimientoVO movimiento = BuildMovimientoVO(obj);
            return dao.Insert(movimiento);
        }

        public bool Update(Movimiento obj)
        {
            IDAO<MovimientoVO> dao = new DAOMovimiento();
            MovimientoVO movimiento = BuildMovimientoVO(obj);
            return dao.Update(movimiento);
        }

        public bool Delete(Movimiento obj)
        {
            IDAO<MovimientoVO> dao = new DAOMovimiento();
            MovimientoVO movimiento = BuildMovimientoVO(obj);
            return dao.Delete(movimiento);
        }


        public List<Movimiento> GetAll()
        {
            IDAO<MovimientoVO> dao = new DAOMovimiento();
            List<Movimiento> lista = new List<Movimiento>();

            foreach (MovimientoVO obj in dao.GetAll())
            {
                Movimiento movimiento = new Movimiento(obj);
                lista.Add(movimiento);
            }

            return lista;
        }

        #endregion


        #region Public Methods

        public int GetNextCode()
        {
            DAOMovimiento dao = new DAOMovimiento();
            return dao.GetNextCode();
        }

        public List<string> GetListTipo(Cuenta cuenta)
        {
            DAOMovimiento dao = new DAOMovimiento();
            CuentaVO cuentaVO = new CuentaVO();

            cuentaVO.Codigo = cuenta.Codigo;

            return dao.GetListTipo(cuentaVO);
        }


        public double GetSaldoInicial(DateTime fecha, Cuenta cuenta)
        {
            DAOMovimiento dao = new DAOMovimiento();
            CuentaVO cuentaVO = new CuentaVO();

            cuentaVO.Codigo = cuenta.Codigo;

            return dao.GetSaldoInicial(fecha, cuentaVO);
        }

        public List<Movimiento> GetMovtosPeriodo(DateTime desde, DateTime hasta, Cuenta cuenta)
        {
            DAOMovimiento dao = new DAOMovimiento();
            CuentaVO cuentaVO = new CuentaVO();
            List<Movimiento> lista = new List<Movimiento>();

            cuentaVO.Codigo = cuenta.Codigo;

            foreach (MovimientoVO obj in dao.GetMovtosPeriodo(desde, hasta, cuentaVO))
            {
                Movimiento movimiento = new Movimiento(obj);
                lista.Add(movimiento);
            }

            return lista;
        }
            

        #endregion

        #region Private Methods

        private MovimientoVO BuildMovimientoVO(Movimiento obj)
        {
            MonedaVO moneda = new MonedaVO(obj.Cuenta.Moneda.Codigo, obj.Cuenta.Moneda.Nombre, obj.Cuenta.Moneda.Simbolo);
            CuentaVO cuenta = new CuentaVO(obj.Cuenta.Codigo, moneda, obj.Cuenta.Nombre);
            return new MovimientoVO(obj.Codigo, cuenta, obj.Fecha, obj.Tipo, obj.Descripcion, obj.Importe);
        }

        #endregion

    }
}